#include <dretve.h>
#include <ispis.h>
#include <vrijeme.h>
#include <dogadjaji.h>

int red_dog = -1;

static void tobrada1 (dogadjaj_t *dog, void *param)
{
	ispisi("[obrada1 %d] ", *((int *) param));
	ispisi("Tip=%d, param=%d, pparam=%x, prio=%d, kada=%d:%d, id=%d\n",
		dog->tip, dog->param, dog->pparam, dog->prio, 
		dog->kada.sekunde, dog->kada.nsekunde/1000000, dog->id_gen);
}
static void tobrada2 (dogadjaj_t *dog, void *param)
{
	ispisi("[obrada2 %d] ", *((int *) param));
	ispisi("Tip=%d, param=%d, pparam=%x, prio=%d, kada=%d:%d, id=%d\n",
		dog->tip, dog->param, dog->pparam, dog->prio, 
		dog->kada.sekunde, dog->kada.nsekunde/1000000, dog->id_gen);
}
static void tdretva (void *param)
{
	int i, id = id_dretve();
	vrijeme_t koliko;
	dogadjaj_t dog;
	int povvr;

	koliko.sekunde = 3;
	koliko.nsekunde = 0;
	
	prijavi_se_na_red_dogadjaja(RED_DOG_DRETVE, tobrada1, &id);
	prijavi_se_na_red_dogadjaja(red_dog, tobrada2, &id);

	ispisi("Dretva %d, prioritet=%d, pocetak\n", id, dohvati_prioritet(-1));

#define NN 3
	for (i = 0; i < NN; i++) {
		ispisi("Dretva %d, prolaz %d/%d (%d)\n", id, i + 1, NN,
			dohvati_prioritet(-1));
		odgodi(koliko);
	}
#undef NN

	//slanje signala "sebi"
	postavi_dogadjaj (1, 2, NULL, 33, DOG_ZA_RED, red_dog);

	povvr = dohvati_dogadjaj (red_dog, 0, &dog, 0);
	ispisi("[dohvat %d (%d)]", id, povvr);
	if (povvr == 0) {
		ispisi("Tip=%d, param=%d, pparam=%x, prio=%d, kada=%d:%d, "
			"id=%d\n", dog.tip, dog.param, dog.pparam, dog.prio,
			dog.kada.sekunde, dog.kada.nsekunde/1000000,
			dog.id_gen);
	}
	else {
		ispisi("\n");
	}

	povvr = dohvati_dogadjaj (RED_DOG_DRETVE, 0, &dog, 0);
	ispisi("[dohvat %d (%d)]", id, povvr);
	if (povvr == 0) {
		ispisi("Tip=%d, param=%d, pparam=%x, prio=%d, kada=%d:%d, "
			"id=%d\n", dog.tip, dog.param, dog.pparam, dog.prio,
			dog.kada.sekunde, dog.kada.nsekunde/1000000,
			dog.id_gen);
	}
	else {
		ispisi("\n");
	}

	povvr = dohvati_dogadjaj (RED_DOG_DRETVE, 0, &dog, 0);
	ispisi("[dohvat %d (%d)]", id, povvr);
	if (povvr == 0) {
		ispisi("Tip=%d, param=%d, pparam=%x, prio=%d, kada=%d:%d, "
			"id=%d\n", dog.tip, dog.param, dog.pparam, dog.prio,
			dog.kada.sekunde, dog.kada.nsekunde/1000000,
			dog.id_gen);
	}
	else {
		ispisi("\n");
	}

	povvr = dohvati_dogadjaj (red_dog, 0, &dog, DOG_CEKAJ);
	ispisi("[dohvat %d (%d)]", id, povvr);
	if (povvr == 0) {
		ispisi("Tip=%d, param=%d, pparam=%x, prio=%d, kada=%d:%d, "
			"id=%d\n", dog.tip, dog.param, dog.pparam, dog.prio,
			dog.kada.sekunde, dog.kada.nsekunde/1000000,
			dog.id_gen);
	}
	else {
		ispisi("\n");
	}

	ispisi("Dretva %d zavrsava\n", id);
}

void test_dogadjaji2()
{
	int dr1, dr2, i1 = 1, i2 = 2, i3 = 3;
	vrijeme_t koliko;

	ispisi("\n\n[%s:%s]\n", __FILE__, __FUNCTION__);

	koliko.sekunde = 2;
	koliko.nsekunde = 0;
	
	//red_dog = stvori_red_dogadjaja (DOG_PO_REDU | DOG_MICE_SE, 0);
	//red_dog = stvori_red_dogadjaja (DOG_PO_REDU, 0);
	//red_dog = stvori_red_dogadjaja (DOG_SVIMA, 0);
	//red_dog = stvori_red_dogadjaja (DOG_SVIMA | DOG_OSTAJE, 0);
	red_dog = stvori_red_dogadjaja (DOG_NIKOME | DOG_OSTAJE, 0);
	
	dr1 = stvori_dretvu(tdretva, &i1);
	dr2 = stvori_dretvu(tdretva, &i2);
	if (dr1 == -1 || dr2 == -1)
		return; //nije potrebno ispisivati poruku o gresci, to je vec

	odgodi(koliko);
	postavi_dogadjaj (1, 2, &i3, 10, DOG_ZA_RED, red_dog);
	postavi_dogadjaj (3, 1, &i2, 15, DOG_ZA_RED, red_dog);
	postavi_dogadjaj (7, 1, &i2, 150, DOG_ZA_RED, red_dog);

	odgodi(koliko);
	postavi_dogadjaj (7, 1, &i2, 223, DOG_ZA_RED, red_dog);

	//koliko.sekunde = 10;
	//odgodi(koliko);
	postavi_dogadjaj (23, 2, &i3, 150, DOG_ZA_RED, red_dog);

	cekaj_kraj_dretve(dr1);
	cekaj_kraj_dretve(dr2);
}
